import random
import sys
import os


def get_user_input():
    """
    A成员：汪靖翔
    功能点1：编写一个函数，提示用户输入健康目标（如减肥、增肌、增肥）和食物喜好（如素食、非素食、无限制）。
    功能点2：检查用户输入的合法性，并将其转换为程序可以处理的格式。返回用户的输入结果，例如 {"目标": "减肥", "喜好": "素食"}。
    """
    num = 0
    while True:
        target = input("请输入您的健康目标（如减肥、增肌、增肥）：")
        preference = input("请输入您的食物喜好（如素食、非素食）：")   # 获取目标丶喜好
        if target in ['减肥', '增肌', '增肥'] and preference in ['素食', '非素食']:   # 判断输入是否为空
            return {"目标": target, "喜好": preference}
        else:
            num += 1
            if num == 2:
                sys.exit("输入错误两次，程序自动退出")
            else:
                print("输入错误，请按照提示重新输入！")


def generate_diet_plan(user_input):
    """
    B成员：刘家福
    功能点1：编写一个函数，先调用成员 C 的读取全部食谱的函数获取全部食谱，再根据成员 A 的输入，找出合适的食物组合。
    功能点2：根据找出的食物组合，生成一周的饮食计划，然后返回该计划。
    """
    target = user_input["目标"]
    preference = user_input["喜好"]

    all_foods = read_from_file()
    # 调用C成员函数，读取食谱
    for target_1 in all_foods.keys():
        # 遍历all_foods所有的键
        if target == target_1:
            for preference_1 in all_foods[target_1].keys():
                # 遍历all_foods[target_1]对应内容的键
                if preference == preference_1:
                    diet_plan = {}
                    # 一周的食谱
                    for day in ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]:
                        # 随机选择早餐、午餐、晚餐的食物
                        breakfast = all_foods[target_1][preference_1][
                            random.randint(0, len(all_foods[target_1][preference_1]) - 1)]
                        lunch = all_foods[target_1][preference_1][
                            random.randint(0, len(all_foods[target_1][preference_1]) - 1)]
                        dinner = all_foods[target_1][preference_1][
                            random.randint(0, len(all_foods[target_1][preference_1]) - 1)]
                        # 将每天的食物组合存入字典中
                        diet_plan[day] = {"早餐": breakfast, "午餐": lunch, "晚餐": dinner}

                    return diet_plan


def save_to_file(data):
    """
    C成员：许献峰
    功能点1：将食物格式化为字典或者列表，并保存到文件中（参照实现提示中的食物）。
    功能点2：编写一个函数，将生成的饮食计划写入到文件中.
    """
    with open("diet_plan.txt", "w", encoding='utf-8') as f:
        f.write(str(data))


def read_from_file():
    """
    功能点3：编写一个函数，从文件中读取食谱文件，使用 eval() 函数格式化为字典并返回。
    """
    if os.path.exists("all_foods.txt"):
        with open("all_foods.txt", "r", encoding='utf-8') as f:
            data = f.read()
            return eval(data)
    else:
        print("文件不存在！")
        return {}


def show_diet_plan():
    """
    D成员：梁大远
    功能点1：编写一个函数，先调用成员 A 获取用户输入，再调用成员 B 的饮食计划生成函数获取饮食计划，格式化并打印出来。
    最后调用成员 C 的保存函数，将饮食计划写入文件。
    功能点2：从文件中读取并格式化打印出生成的饮食计划，例如："周一：早餐 - 燕麦粥，午餐 - 蔬菜沙拉，晚餐 - 豆腐蒸菜".
    """
    user_input = get_user_input()
    diet_plan = generate_diet_plan(user_input)

    for day, foods in diet_plan.items():
        print(f"{day}：早餐 - {foods['早餐']}，午餐 - {foods['午餐']}，晚餐 - {foods['晚餐']}")

    save_to_file(diet_plan)  # 成员 C 的保存函数，将饮食计划写入文件


if __name__ == '__main__':
    show_diet_plan()  #在此模块文件下显示